emoji: Skip overly wide fallback rendering
authorMatthias Clasen <mclasen@redhat.com>
Mon, 18 Dec 2017 03:09:08 +0000 (22:09 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 18 Dec 2017 03:11:24 +0000 (22:11 -0500)
Some emoji fonts (such as Emoji One), render Emoji sequences
such as some of the family variations using multiple individual
glyphs. This rendering is too wide and breaks our grid layout.
Therefore, we will just skip any sequence whose rendering is
more than twice as wide as a simple smiley.

gtk/gtkemojichooser.c

index 596c92e12fa202897a486e988abf4ccf2602fc13..9f1cb412443c43565caa2b629e7c343fe735948d 100644 (file)
@@ -343,6 +343,9 @@ add_emoji (GtkWidget    *box,
   char text[64];
   char *p = text;
   int i;
+  PangoLayout *layout;
+  PangoRectangle rect;
+  int width;
 
   codes = g_variant_get_child_value (item, 0);
   for (i = 0; i < g_variant_n_children (codes); i++)
@@ -358,12 +361,27 @@ add_emoji (GtkWidget    *box,
   g_variant_unref (codes);
   p[0] = 0;
 
-  label = gtk_label_new (text);
+  label = gtk_label_new ("🙂");
   attrs = pango_attr_list_new ();
   pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_X_LARGE));
   gtk_label_set_attributes (GTK_LABEL (label), attrs);
   pango_attr_list_unref (attrs);
 
+  layout = gtk_label_get_layout (GTK_LABEL (label));
+  pango_layout_get_extents (layout, &rect, NULL);
+  width = rect.width;
+
+  gtk_label_set_text (GTK_LABEL (label), text);
+  layout = gtk_label_get_layout (GTK_LABEL (label));
+  pango_layout_get_extents (layout, &rect, NULL);
+
+  /* Check for fallback rendering that generates too wide items */
+  if (rect.width >= 2 * width)
+    {
+      gtk_widget_destroy (label);
+      return;
+    }
+
   child = gtk_flow_box_child_new ();
   gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji");
   g_object_set_data_full (G_OBJECT (child), "emoji-data",